2004年05月20日
川俣晶の縁側ソフトウェア技術雑記 total 5352 count

VB.NETの=演算子のオーバーヘッド・C#の=演算子より遅い?

Written By: 川俣 晶連絡先

 菊池和彦の足跡文字列比較のパフォーマンスを見て、VB.NETの文字列比較が具体的にどう処理されているのかが気になったのでちょっと調べてみました。

 具体的には、Option Compare Binaryの場合と、Option Compare Textの場合で、生成するコードにどのような差があるのか、調べてみました。

 Option Compare Textの場合は重い処理になるのはやむを得ないとしても、Option Compare Binaryは軽くても良いのではないか、と思ったのですが。

 結果は以下のごとくしです。

 両者の相違は、Microsoft.VisualBasic.CompilerServices.StringType::StrCmpを呼び出す引数の値が違うだけ。(相違点を強調で示してあります)

 つまり、このメソッド自身の処理は、Option Compare Binaryの方が軽いとしても、呼び出しのオーバーヘッドは同じということになります。C#の==演算子で呼び出す文字列比較メソッドを使う場合よりも、引数が多く、内部で引数の判定も行う必要がある(と思う)ので、それだけ見ても同じ速さにならないのは当然と思われます。

 というわけで、力尽きたので、検証はここまで (汗

文字列をバイナリ比較するテスト §

VB.NETソース §

Option Compare Binary

Public Class binaryClass1

    Public Function test(ByVal a As String, ByVal b As String)

        Return a = b

    End Function

End Class

.NET Reflectorによる逆アセンブルリスト §

.method public instance object test(string a, string b) cil managed

{

// Code Size: 22 byte(s)

.maxstack 3

.locals (object V_0)

L_0000: nop 

L_0001: ldarg.1 

L_0002: ldarg.2 

L_0003: ldc.i4.0 

L_0004: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StringType::StrCmp(string, string, bool)

L_0009: ldc.i4.0 

L_000a: ceq 

L_000c: box bool

L_0011: stloc.0 

L_0012: br.s L_0014

L_0014: ldloc.0 

L_0015: ret 

文字列をTEXT比較するテスト §

VB.NETソース §

Option Compare Text

Public Class textClass1

    Public Function test(ByVal a As String, ByVal b As String)

        Return a = b

    End Function

End Class

.NET Reflectorによる逆アセンブルリスト §

.method public instance object test(string a, string b) cil managed

{

// Code Size: 22 byte(s)

.maxstack 3

.locals (object V_0)

L_0000: nop 

L_0001: ldarg.1 

L_0002: ldarg.2 

L_0003: ldc.i4.1 

L_0004: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StringType::StrCmp(string, string, bool)

L_0009: ldc.i4.0 

L_000a: ceq 

L_000c: box bool

L_0011: stloc.0 

L_0012: br.s L_0014

L_0014: ldloc.0 

L_0015: ret